{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "09593bcf",
   "metadata": {},
   "source": [
    "# 디렉토리에서 문서를 로드하는 방법\n",
    "\n",
    "LangChain의 [DirectoryLoader](https://api.python.langchain.com/en/latest/document_loaders/langchain_community.document_loaders.directory.DirectoryLoader.html)는 디스크에서 파일을 읽어 LangChain [Document](https://api.python.langchain.com/en/latest/documents/langchain_core.documents.base.Document.html#langchain_core.documents.base.Document) 객체로 변환하는 기능을 구현합니다. \n",
    "\n",
    "이번 튜토리얼은 다음의 내용을 포함합니다.\n",
    "- 와일드카드 패턴을 포함하여 파일 시스템에서 로드하는 방법\n",
    "- 파일 I/O에 멀티스레딩을 사용하는 방법\n",
    "- 특정 파일 유형(예: 코드)을 파싱하기 위해 사용자 정의 로더 클래스를 사용하는 방법\n",
    "- 디코딩으로 인한 오류와 같은 오류를 처리하는 방법"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "741aee81",
   "metadata": {},
   "source": [
    "**DirectoryLoader**는 기본적으로 [UnstructuredLoader](https://python.langchain.com/v0.2/docs/integrations/providers/unstructured/)\n",
    "를 `loader_cls` kwarg로 받아들입니다. [Unstructured](https://unstructured-io.github.io/unstructured/)는 PDF와 HTML과 같은 다양한 형식의 파싱을 지원합니다. 여기서는 마크다운(.md) 파일을 읽기 위해 사용합니다.\n",
    "\n",
    "`glob` 매개변수를 사용하여 로드할 파일 형식을 제어할 수 있습니다. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2bb0d59a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import DirectoryLoader\n",
    "\n",
    "# 디렉토리 로더 초기화\n",
    "loader = DirectoryLoader(\"../\", glob=\"**/*.md\")\n",
    "# 문서 로드\n",
    "docs = loader.load()\n",
    "# 문서 개수 계산\n",
    "len(docs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6c839fda",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 페이지 내용 출력\n",
    "print(docs[0].page_content[:100])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6083f607",
   "metadata": {},
   "source": [
    "기본적으로 진행 상태 표시줄은 표시되지 않습니다. `show_progress=True` 옵션으로 진행상황을 확인할 수 있습니다.\n",
    "\n",
    "**참고**\n",
    "- 진행 상태 표시줄을 표시하려면 `tqdm` 라이브러리를 설치(예: `pip install tqdm`)\n",
    "- `show_progress` 매개변수를 `True`로 설정"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c3dfd50",
   "metadata": {},
   "outputs": [],
   "source": [
    "loader = DirectoryLoader(\n",
    "    \"../\", glob=\"**/*.md\", show_progress=True\n",
    ")  # 디렉토리 로더 설정\n",
    "docs = loader.load()  # 문서 로드"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4394afcf",
   "metadata": {},
   "source": [
    "기본적으로 로딩은 하나의 스레드에서 이루어집니다. \n",
    "\n",
    "만약, 여러 스레드를 활용하려면 `use_multithreading` 플래그를 true로 설정하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4c00d96f",
   "metadata": {},
   "outputs": [],
   "source": [
    "loader = DirectoryLoader(\n",
    "    \"../\", glob=\"**/*.md\", use_multithreading=True\n",
    ")  # 디렉토리 로더 설정\n",
    "docs = loader.load()  # 문서 로드"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c9b6f808",
   "metadata": {},
   "source": [
    "## loader_cls 변경\n",
    "\n",
    "`loader_cls` 는 기본 값으로 `UnstructuredLoader` 클래스를 사용합니다. \n",
    "\n",
    "로더를 사용자 정의하려면 `loader_cls` kwarg에 로더 클래스를 지정하세요. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "be78ef4b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import TextLoader\n",
    "\n",
    "# loader_cls 를 TextLoader 로 변경합니다.\n",
    "loader = DirectoryLoader(\"../\", glob=\"**/*.md\", loader_cls=TextLoader)\n",
    "\n",
    "# 문서 로드\n",
    "docs = loader.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9814666e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 문서 페이지 내용 출력\n",
    "print(docs[0].page_content[:100])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66edfd05",
   "metadata": {},
   "source": [
    "`UnstructuredLoader`는 Markdown 헤더를 파싱하는 반면, `TextLoader`는 그렇지 않습니다.\n",
    "\n",
    "Python 소스 코드 파일을 로드해야 하는 경우, `PythonLoader`를 사용하세요."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2413178a",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain_community.document_loaders import PythonLoader\n",
    "\n",
    "# 현재폴더(.) 의 .py 파일을 모두 조회하여 PythonLoader 로 로드\n",
    "loader = DirectoryLoader(\".\", glob=\"**/*.py\", loader_cls=PythonLoader)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2d961519",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 문서 로드\n",
    "docs = loader.load()\n",
    "docs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "310a95bf",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "langchain-kr-lwwSZlnu-py3.11",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
